home *** CD-ROM | disk | FTP | other *** search
/ Visual Basic Source Code / Visual Basic Source Code.iso / vbsource / powervww / pvcheck.cpp < prev    next >
C/C++ Source or Header  |  1998-01-05  |  8KB  |  388 lines

  1. //  ____________________________________________________
  2. // |                                                    |
  3. // |  Project:     POWER VIEW INTERFACE                 |
  4. // |  File:        PVCHECK.CPP                          |
  5. // |  Compiler:    WPP386 (10.6)                        |
  6. // |                                                    |
  7. // |  Subject:     Check-boxes & radio-buttons          |
  8. // |                                                    |
  9. // |  Author:      Emil Dotchevski                      |
  10. // |____________________________________________________|
  11. //
  12. // E-mail: zajo@geocities.com
  13. // URL:    http://www.geocities.com/SiliconValley/Bay/3577
  14.  
  15. #define uses_string
  16. #define uses_check
  17. #define uses_dc
  18. #define uses_dialog
  19. #define uses_icons
  20. #define uses_system
  21.  
  22. #include "PVuses.h"
  23.  
  24. static int *old_data = NULL;
  25. static short *old_short_data = NULL;
  26.  
  27. //Tcluster publics:
  28.  
  29. Tcluster::Tcluster( char *_prompt ):
  30.   Titem( i_cluster_len + 1 + smart_len( _prompt ), 1 )
  31. {
  32.   prompt = STRDUP( _prompt );
  33.   shortcut = get_shortcut( _prompt );
  34. }
  35.  
  36. Tcluster::~Tcluster( void )
  37. {
  38.   FREE( prompt );
  39. }
  40.  
  41. void Tcluster::set_prompt( char *_prompt )
  42. {
  43.   FREE( prompt );
  44.   prompt = STRDUP( _prompt );
  45.   redraw();
  46. }
  47.  
  48. //Tcluster protected
  49.  
  50. void Tcluster::event_handler( Tevent &ev )
  51. {
  52.   if(
  53.       (
  54.         ( ev.code != evKEY_PRESS ) || ( ev.ASCII != shortcut )
  55.       ) &&
  56.       (
  57.         !state( isFOCUSED ) ||
  58.           (
  59.             ( ( ev.code != evKEY_PRESS ) || ( ev.ASCII != kSPACE ) )
  60. #ifndef NOMOUSE
  61.          && ( ( ev.code != evMOUSE_UP ) || !ev.INSIDE )
  62. #endif
  63.           )
  64.       )
  65.     )
  66.     Titem::event_handler( ev );
  67.   else
  68.   {
  69.     focus();
  70.     if( state(isFOCUSED) ) press();
  71.     redraw();
  72.     handled( ev );
  73.   }
  74. }
  75.  
  76. void Tcluster::draw_cluster( char *box )
  77. {
  78.   char s;
  79.  
  80.   s = 't';
  81.   if( state( isDISABLED ) )
  82.   {
  83.     s = 'd';
  84.     shortcut_attr = disabled_attr;
  85.   }
  86.   else
  87.     if( state( isSELECTED ) ) s = 'b';
  88.   txtf( "|%c%s %s", s, box, prompt );
  89. }
  90.  
  91. //Tcheck publics:
  92.  
  93. Tcheck::Tcheck( char *_prompt, boolean &_data ):
  94.   Tcluster( _prompt )
  95. {
  96.   data_ptr = &_data;
  97.   data = _data;
  98. }
  99.  
  100. //Tcheck protected:
  101.  
  102. void Tcheck::draw( void )
  103. {
  104.   if( data ) draw_cluster( i_check_on ); else draw_cluster( i_check_off );
  105. }
  106.  
  107. void Tcheck::press( void )
  108. {
  109.   data = !data;
  110.   item_acted = this;
  111. }
  112.  
  113. void Tcheck::press( boolean state )
  114. {
  115.   data = state;
  116.   item_acted = this;
  117. }
  118.  
  119. boolean Tcheck::pressed( void )
  120. {
  121.   return data != 0;
  122. }
  123.  
  124. void Tcheck::ok_item( void )
  125. {
  126.   *data_ptr = data;
  127. }
  128.  
  129. //Tcheckb publics:
  130.  
  131. Tcheckb::Tcheckb( char *_prompt, uint &_data, uint _bit ):
  132.   Tcheck( _prompt, tmp_data )
  133. {
  134.   _data_ptr = &_data;
  135.   bit = _bit;
  136.   tmp_data =  ( ( _data & _bit ) != 0 );
  137.   data_ptr = &tmp_data;
  138.   data = tmp_data;
  139. }
  140.  
  141. //Tcheckb protected:
  142.  
  143. void Tcheckb::ok_item( void )
  144. {
  145.   Tcheck::ok_item();
  146.   if( tmp_data )
  147.     *_data_ptr |= bit;
  148.   else
  149.     *_data_ptr &= ~bit;
  150. }
  151.  
  152. //Tcheckw publics:
  153.  
  154. Tcheckw::Tcheckw( char *_prompt, word &_data, uint _bit ):
  155.   Tcheck( _prompt, tmp_data )
  156. {
  157.   _data_ptr = &_data;
  158.   bit = _bit;
  159.   tmp_data =  ( ( _data & _bit ) != 0 );
  160.   data_ptr = &tmp_data;
  161.   data = tmp_data;
  162. }
  163.  
  164. //Tcheckb protected:
  165.  
  166. void Tcheckw::ok_item( void )
  167. {
  168.   Tcheck::ok_item();
  169.   if( tmp_data )
  170.     *_data_ptr |= bit;
  171.   else
  172.     *_data_ptr &= ~bit;
  173. }
  174.  
  175. //Tradio publics:
  176.  
  177. Tradio::Tradio( char *_prompt, int &_data, int _value ):
  178.   Tcluster( _prompt )
  179. {
  180.   data_ptr = &_data; value = _value;
  181.   data = _data;
  182.   if( data_ptr == old_data )
  183.     set_flags( ifTAB_STOP, 0 );
  184.   else
  185.     old_data = data_ptr;
  186. }
  187.  
  188. void Tradio::press( void )
  189. {
  190.   _command_info( data_ptr, 0 ); broadcast( cmRADIO_DEPRESS );
  191.   data = value;
  192.   item_acted = this;
  193. }
  194.  
  195. #pragma off( unreferenced )
  196. void Tradio::press( boolean state )
  197. {
  198.   press();
  199. }
  200. #pragma on( unreferenced )
  201.  
  202. boolean Tradio::pressed( void )
  203. {
  204.   return data == value;
  205. }
  206.  
  207. //Tradio protected:
  208.  
  209. void Tradio::draw( void )
  210. {
  211.   if( data == value ) draw_cluster( i_radio_on ); else draw_cluster( i_radio_off );
  212. }
  213.  
  214. void Tradio::event_handler( Tevent &ev )
  215. {
  216.   if( ( ev.code != evCOMMAND ) || ( ev.CMD_CODE != cmRADIO_DEPRESS ) ||
  217.      ( ev.CMD_INFO != data_ptr ) || ( value != data ) )
  218.     Tcluster::event_handler( ev );
  219.   else
  220.   {
  221.     data = 0;
  222.     redraw();
  223.     handled( ev );
  224.   }
  225.   old_data = NULL;
  226. }
  227.  
  228. void Tradio::ok_item( void )
  229. {
  230.   if( data == value ) *data_ptr = data;
  231. }
  232.  
  233. //Tshort_radio publics:
  234.  
  235. Tshort_radio::Tshort_radio( char *_prompt, short &_data, short _value ):
  236.   Tcluster( _prompt )
  237. {
  238.   data_ptr = &_data; value = _value;
  239.   data = _data;
  240.   if( data_ptr == old_short_data )
  241.     set_flags( ifTAB_STOP, 0 );
  242.   else
  243.     old_short_data = data_ptr;
  244. }
  245.  
  246. void Tshort_radio::press( void )
  247. {
  248.   _command_info( data_ptr, 0 ); broadcast( cmRADIO_DEPRESS );
  249.   data = value;
  250.   item_acted = this;
  251. }
  252.  
  253. #pragma off( unreferenced )
  254. void Tshort_radio::press( boolean state )
  255. {
  256.   press();
  257. }
  258. #pragma on( unreferenced )
  259.  
  260. boolean Tshort_radio::pressed( void )
  261. {
  262.   return data == value;
  263. }
  264.  
  265. //Tradio protected:
  266.  
  267. void Tshort_radio::draw( void )
  268. {
  269.   if( data == value ) draw_cluster( i_radio_on ); else draw_cluster( i_radio_off );
  270. }
  271.  
  272. void Tshort_radio::event_handler( Tevent &ev )
  273. {
  274.   if( ( ev.code != evCOMMAND ) || ( ev.CMD_CODE != cmRADIO_DEPRESS ) ||
  275.      ( ev.CMD_INFO != data_ptr ) || ( value != data ) )
  276.     Tcluster::event_handler( ev );
  277.   else
  278.   {
  279.     data = 0;
  280.     redraw();
  281.     handled( ev );
  282.   }
  283.   old_short_data = NULL;
  284. }
  285.  
  286. void Tshort_radio::ok_item( void )
  287. {
  288.   if( data == value ) *data_ptr = data;
  289. }
  290.  
  291. //CONSTRUCTORS FOR USE WITH DIALOG BOXES
  292.  
  293. /*
  294.   Description:
  295.     Construct a check item and insert it in the dialog box.
  296.   Entry:
  297.     t    - title of the check item, shortcut prefix '|~';
  298.     data - boolean that holds current check state.
  299.   Exit:
  300.     Return pointer to the check item.
  301. */
  302. Tcheck *check( char *t, boolean &data )
  303. {
  304.   Tcheck *c;
  305.  
  306.   c = NEW( Tcheck( t, data ) );
  307.   put_item( c, c->xl + 1, 1 );
  308.   return c;
  309. }
  310.  
  311. /*
  312.   Description:
  313.     Construct a bit-check item and insert it in the dialog box.
  314.   Entry:
  315.     t    - title of the bit-check item, shortcut prefix '|~';
  316.     data - uint that holds current check state bits.
  317.     bit  - bitmask for the bits to be affected.
  318.   Exit:
  319.     Return pointer to the check item.
  320. */
  321. Tcheckb *check( char *t, uint &data, uint bit )
  322. {
  323.   Tcheckb *c;
  324.  
  325.   c = NEW( Tcheckb( t, data, bit ) );
  326.   put_item( c, c->xl + 1, 1 );
  327.   return c;
  328. }
  329.  
  330. /*
  331.   Description:
  332.     Construct a bit-check word item and insert it in the dialog box.
  333.   Entry:
  334.     t    - title of the bit-check item, shortcut prefix '|~';
  335.     data - word that holds current check state bits.
  336.     bit  - bitmask for the bits to be affected.
  337.   Exit:
  338.     Return pointer to the check item.
  339. */
  340. Tcheckw *check( char *t, word &data, uint bit )
  341. {
  342.   Tcheckw *c;
  343.  
  344.   c = NEW( Tcheckw( t, data, bit ) );
  345.   put_item( c, c->xl + 1, 1 );
  346.   return c;
  347. }
  348.  
  349. /*
  350.   Description:
  351.     Construct a radio button and insert it in the dialog box.
  352.   Entry:
  353.     t     - title of the radio button, shortcut prefix '|~';
  354.     data  - address of the integer that holds current radio buttons state;
  355.     value - the value responding to this radio button. All radio buttons
  356.             attached to one 'data' must have different values.
  357.   Exit:
  358.     Return pointer to the radio button.
  359. */
  360. Tradio *radio( char *t, int &data, int value )
  361. {
  362.   Tradio *r;
  363.  
  364.   r = NEW( Tradio( t, data, value ) );
  365.   put_item( r, r->xl + 1, 1 );
  366.   return r;
  367. }
  368.  
  369. /*
  370.   Description:
  371.     Construct a radio button and insert it in the dialog box.
  372.   Entry:
  373.     t     - title of the radio button, shortcut prefix '|~';
  374.     data  - address of the short that holds current radio buttons state;
  375.     value - the value responding to this radio button. All radio buttons
  376.             attached to one 'data' must have different values.
  377.   Exit:
  378.     Return pointer to the radio button.
  379. */
  380. Tshort_radio *radio( char *t, short &data, int value )
  381. {
  382.   Tshort_radio *r;
  383.  
  384.   r = NEW